package com.itheima.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author ：石破天
 * @date ：Created in 2023年02月07日
 * @description ：
 *    经济公司
 *       给 明星 产生代理对象 帮助明星 完成功能的增强
 * @version: 1.0
 */
public class ProxyFactory {//经纪公司  可以为明星生成一个 代理对象
    /*
      方法返回值 写 Star  接收代理对象   --明星对象的代理
           代理对象和 明星 需要具备相同的功能
             所以代理对象 也是 Star接口实现类对象
     * @param bigStar 明星对象
     * @return        代理对象
     */
    public static Star createProxy(BigStar bigStar){//传入一个明星对象！
        //JDK 产生代理的方式 是通过
        /*
        public static Object newProxyInstance(ClassLoader loader, 用于指定加载类  到内存的一个类加载器
                                          Class<?>[] interfaces, 明星实现的接口
                                          InvocationHandler h) 用于指定代理对象干什么！！！

         */
        Star startProxy = (Star) Proxy.newProxyInstance(ProxyFactory.class.getClassLoader(),//获取了当前类的加载器，后面负责代理类的加载
                new Class[]{Star.class},//bigStar.getClass().getInterfaces()
                new InvocationHandler() {

                    /**
                     *  用于拦截  明星的唱歌跳舞 对唱歌跳舞进行增强控制
                     * @param proxy  代理对象
                     * @param method  拦截的方法  sing("好日子")  dance()
                     * @param args    参数     {"好日子"}
                     * @return    方法的返回值 执行方法的返回值
                     * @throws Throwable
                     */
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                        if(method.getName().equals("sing")){// 代理对象拦住 唱歌方法 进行增强
                            System.out.println("准备话筒，收钱200~");
                            // 大明星唱歌   method 反射调用
                        }else if(method.getName().equals("dance")){
                            System.out.println("准备场地，收钱30W~");
                            // 大明星跳舞 method 反射调用
                        }

                        return method.invoke(bigStar,args);//反射执行 被代理人的功能
                               // 执行杨超越的方法
                    }
                });

        return startProxy;
    }
}
